int numSubarraysWithSum(int* nums, int numsSize, int goal) {
    for(int i = 1; i < numsSize; i++){
        nums[i] += nums[i - 1];//后一项累加前一项：1 0 1 0 1 -> 1 1 2 2 3
    }
    int hash[60001], ans = 0;//goal <= 30000
    memset(hash, 0, sizeof(hash));
    hash[goal] = 1;//假定goal = 3
    for(int i = 0; i < numsSize; i++){
        ans += hash[nums[i]];
        hash[nums[i] + goal]++;//hash:0 0 0 1 2 2 1//告诉后面计算到numSize - 1为止有几个总和为goal
    }
    return ans;
}

/*给你一个二元数组 nums ，和一个整数 goal ，请你统计并返回有多少个和为 goal 的非空子数组。

子数组是数组的一段连续部分*/